package br.com.automed.authentication;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

import br.com.automed.entity.Usuario;
import br.com.automed.enumeration.EnumPaginasAdministrador;
import br.com.automed.enumeration.EnumPaginasFuncionario;
import br.com.automed.enumeration.EnumPaginasPaciente;
import br.com.automed.util.Constantes;

public class Autenticacao implements PhaseListener {

	private static final String PACIENTE = "/paginas/paciente/";
	private static final String ADMINISTRADOR = "/paginas/administrador/";
	private static final String FUNCIONARIO = "/paginas/funcionario/";

	/**
	 * 
	 */
	private static final long serialVersionUID = -7808794021581873280L;

	public void afterPhase(PhaseEvent event) {
		FacesContext context = event.getFacesContext();
		final String url = context.getViewRoot().getViewId();
		Usuario usuario = context.getApplication().evaluateExpressionGet(context, "#{usuarioLogadoBean.form.usuario}", Usuario.class);
		
		if((url.contains(PACIENTE) || url.contains(ADMINISTRADOR) || url.contains(FUNCIONARIO)) && usuario == null){
			redirecionaUsuario(context,"acesso_negado");									
		}else if((url.contains(PACIENTE) || url.contains(ADMINISTRADOR) || url.contains(FUNCIONARIO)) && usuario != null){
			
			if(EnumPaginasPaciente.paginaExiste(url) && !usuario.getPerfil().getTipoPerfil().equals(Constantes.PACIENTE)){
				redirecionaUsuario(context,"acesso_negado");
			}else if(EnumPaginasFuncionario.paginaExiste(url) && !usuario.getPerfil().getTipoPerfil().equals(Constantes.FUNCIONARIO)){
				redirecionaUsuario(context,"acesso_negado");
			}else if(EnumPaginasAdministrador.paginaExiste(url) && !usuario.getPerfil().getTipoPerfil().equals(Constantes.ADMINISTRADOR)){
				redirecionaUsuario(context,"acesso_negado");
			}
		}
		

		
	}

	public void redirecionaUsuario(FacesContext context,String url){
		
		NavigationHandler handler = context.getApplication().getNavigationHandler();		
		handler.handleNavigation(context, null, url);
	
	}
	
	public void beforePhase(PhaseEvent event) {
	}
	

	public PhaseId getPhaseId() {
		
		return PhaseId.RESTORE_VIEW;
	}

}